package DAOS;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import Hibernate.HibernateUtil;
import Negocio.Medico;
import Negocio.Paciente;

public class PacienteDAO {

	private static PacienteDAO instancia = null;
	
	private static SessionFactory sf = null;

	public static PacienteDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new PacienteDAO();
		} 
		return instancia;
	}
	
	public void guardarPaciente(Paciente p){

		Session session = sf.openSession();
		session.beginTransaction();
		session.persist(p);
		session.flush();
		session.getTransaction().commit();
		session.close();

	}


	public void eliminarPaciente(Paciente p){

		Session session = sf.openSession();
		session.beginTransaction();
		session.delete(p);
		session.flush();
		session.getTransaction().commit();
		session.close();
		

	}


	public void modificarPaciente(Paciente p){

		Session session = sf.openSession();
		session.beginTransaction();
		session.update(p);
		session.flush();
		session.getTransaction().commit();
		session.close();

	}


	public List<Object[]> listarPacientes() {

		Session session = sf.openSession();
		Query q1 = session.createQuery
		(
				"SELECT p.nombre, p.apellido, p.telefono, os.nombre, pl.nombre" +
				"FROM Paciente p INNER JOIN p.ObraSocial os INNER JOIN p.plan pl" +
				"WHERE p.os like 's' or p.os like 'S'"
		);
		
		@SuppressWarnings("unchecked")
		List<Object[]> pacientesConOS = new ArrayList<Object[]>(q1.list());
		
		Query q2 = session.createQuery
		(
				"SELECT p.nombre, p.apellido, p.telefono, os.nombre, pl.nombre" +
				"FROM Paciente p INNER JOIN p.ObraSocial as os INNER JOIN p.plan as pl" +
				"WHERE p.os like 'n' or p.os like 'N'"
		);
		
		@SuppressWarnings("unchecked")
		List<Object[]> pacientesSinOS = new ArrayList<Object[]>(q2.list());
		
		List<Object[]> pacientes = new ArrayList<Object[]>();
		pacientes.addAll(pacientesSinOS);
		pacientes.addAll(pacientesConOS);
		
		session.close();
		return pacientes;
		
	}
	
	//CHEKEAR FALTA AGREGAR LA OS Y EL PLAN!
	public List<Paciente> cargarPacientes () {
		Session session = sf.openSession();
		Query q = session.createQuery(
				"SELECT p.idPaciente, p.tipoDocumento, p.numeroDocumento, p.nombre, p.apellido, p.direccion, p.telefono, p.fechaNacimiento, p.os" +
				"FROM Paciente p"
		);
		
		@SuppressWarnings("unchecked")
		List<Paciente> pp = new ArrayList<Paciente>(q.list());
		
		session.close();
		
		return pp;
		
	}
	public Paciente cargarUnPaciente (long DNI) {
		Paciente p = new Paciente();
		Session session = sf.openSession();
		session.load(p, DNI);
		session.close();
	
		return p;
		
	}
	
	
}
